import { observe } from ".";

//  主要做拦截用户调用push shift unshift pop reverse sort splice等

// 先获取老的数组方法，只改写这7个方法
let oldArrayMethods = Array.prototype;

// 拷贝的一个新的对象，可以查找到老的方法
export let arrayMethods = Object.create(oldArrayMethods);


let methods = [
  'push',
  'shift',
  'pop',
  'unshift',
  'reverse',
  'sort',
  'splice'
]

/**
 * 
 * @param {*} inserted 对数组中新增的每一项进行观测
 */
export function observerArray(inserted){
  inserted.forEach(v => {
    observe(v);
  })
}

methods.forEach(method => {
  arrayMethods[method] = function(...args){ // 函数劫持， 切片编程
    let res = oldArrayMethods[method].apply(this, args);
    console.log('调用了数组的更新方法')

    let inserted;
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args;
        break;
      case 'slice':
        inserted = args.slice(2); // 获取slice 新增的内容
        break;
    
      default:
        break;
    }

    if (inserted) {
      observerArray(inserted)
    }

    // 通知视图更新
    this.__ob__.dep.notify();

    return res;
  }
})


export function dependArray(value){
  for(let i = 0; i < value.length; i++){
    let currentItem = value[i];
    currentItem.__ob__ && currentItem.__ob__.dep.depend();
    if (Array.isArray(currentItem)) {
      dependArray(currentItem); // 递归收集依赖
    }
  }
}